#include "mythread.hpp"
#include "LockGuard.hpp"

using namespace mythread;

// 共享资源，造成了数据不一致的问题
int ticket = 1000;

// void route(ThreadDate *td)
// {
//     //std::cout << td->_name << ": " << "mutex addr: " << td->_lock << std::endl;
//     //sleep(1);
//     while (1)
//     {
//         pthread_mutex_lock(td->_lock);
//         if (ticket > 0)
//         {
//             usleep(1000); // 1ms 抢票花费的时间
//             printf("%s sells ticket: %d\n", td->_name.c_str(), ticket);
//             ticket--;
//             pthread_mutex_unlock(td->_lock);
//         }
//         else
//         {
//             pthread_mutex_unlock(td->_lock);
//             break;
//         }
//     }
// }

void route(ThreadDate *td)
{
    while (1)
    {
        // 是临时对象，并且会自己调用构造和析构
        LockGuard lockguard(td->_lock); // RAII风格的锁
        if (ticket > 0)
        {
            usleep(1000); // 1ms 抢票花费的时间
            printf("%s sells ticket: %d\n", td->_name.c_str(), ticket);
            ticket--;
        }
        else
        {
            break;
        }
    }
}

const int gnum = 5;

int main()
{
    // 使用局部锁
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex,nullptr);

    std::vector<Thread> threads;
    for(int i = 0; i < gnum; i++)
    {
        const std::string name = "thread-" + std::to_string(i+1);
        ThreadDate* td = new ThreadDate(name, &mutex);
        threads.emplace_back(name, route, td);
    }

    for(auto& thread:threads)
    {
        thread.Start();
    }

    for(auto& thread:threads)
    {
        thread.Join();
    }

    // 释放锁
    pthread_mutex_destroy(&mutex);

    return 0;
}


// 使用全局锁
// pthread_mutex_t gmutex = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP;

// void route(const std::string &name)
// {
//     while (1)
//     {
//         pthread_mutex_lock(&gmutex); // 加锁
//         if (ticket > 0)
//         {
//             usleep(1000); // 1ms 抢票花费的时间
//             printf("%s sells ticket: %d\n", name.c_str(), ticket);
//             ticket--;
//             pthread_mutex_unlock(&gmutex); // 解锁
//         }
//         else
//         {
//             pthread_mutex_unlock(&gmutex); // 解锁
//             break;
//         }
//     }
// }


// int main()
// {
//     Thread t1("thread-1", route);
//     Thread t2("thread-2", route);
//     Thread t3("thread-3", route);
//     Thread t4("thread-4", route);

//     t1.Start();
//     t2.Start();
//     t3.Start();
//     t4.Start();

//     t1.Join();
//     t2.Join();
//     t3.Join();
//     t4.Join();
// }